package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.CheckGroupDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.CheckGroup;
import com.itheima.service.CheckGroupService;
import com.itheima.utils.HealthStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.net.InterfaceAddress;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author wgq
 * @date 2019-10-08 14:39
 * 检查组服务实现类
 */
@Service(interfaceClass = CheckGroupService.class)
@Transactional
public class CheckGroupServiceImpl implements CheckGroupService {

    //注入CheckGroupDao对象
    @Autowired
    private CheckGroupDao checkGroupDao;

    /**
     * 检查组分页查询，列表展示
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult pageQuery(QueryPageBean queryPageBean) {
        Integer currentPage = queryPageBean.getCurrentPage();
        if(null == currentPage || currentPage.intValue() <=0){
            currentPage = 1;
        }
        Integer pageSize = queryPageBean.getPageSize();
        if(null == pageSize || pageSize.intValue() <=0){
            pageSize = 10;
        }
        String queryString = queryPageBean.getQueryString();
        //完成分页查询，基于Mybatis框架提供的分页助手插件完成
        //PageHelper底层是基于线程绑定，会把 currentPage,pageSize 这些数据绑定到当前线程，
        //会从当前线程取出数据拼接到我们的SQL后面。所以这个方法不需要返回值
        if(HealthStringUtils.isEmpty(queryString)){
            queryString="";
        }else{
            queryString = queryString.trim();
        }
        //SELECT * FROM t_checkitem LIMIT 1,10
        PageHelper.startPage(currentPage, pageSize);
        Page<CheckGroup> page = checkGroupDao.selectByCondition("%"+queryString+"%");
        long total = page.getTotal();
        List<CheckGroup> result = page.getResult();
        return new PageResult(total,result);
    }

    /**
     * 添加检查组合，同时需要设置检查组合和检查项的关联关系
     * @param checkGroup
     * @param checkItemIds
     */
    @Override
    public void addCheckGroup(CheckGroup checkGroup, Integer[] checkItemIds) {
        if(checkGroupDao.findByCode(checkGroup.getCode())>0){
            throw new RuntimeException("检查组编码已存在");
        }
        if(checkGroupDao.findByName(checkGroup.getName())>0){
            throw new RuntimeException("检查组名称已存在");
        }
        checkGroupDao.addCheckGroup(checkGroup);
        setCheckGroupAndCheckItem(checkGroup.getId(), checkItemIds);
    }

    /**
     * 根据id查看 检查组 的信息
     * @param id
     * @return
     */
    @Override
    public CheckGroup findById(Integer id) {
        CheckGroup checkGroup = checkGroupDao.findById(id);
        return checkGroup;
    }

    /**
     * 查看检查组和检查项之间的关联关系。返回一个数组：检查项的ID
     * @param id
     * @return
     */
    @Override
    public List<Integer> findCheckItemIdsByCheckGroupId(Integer id) {
        List<Integer> checkitemIds = checkGroupDao.findItemIdsByGroupId(id);
        return checkitemIds;
    }

    /**
     * 编辑检查组的信息
     * @param checkGroup
     * @param checkitemIds
     */
    @Override
    public void edit(CheckGroup checkGroup, Integer[] checkitemIds) {
        if(checkGroupDao.findGroupName(checkGroup)>0){
            throw new RuntimeException("检查组名称已存在，请修改...");
        }
        // 根据检查组id删除中间表数据（清理原有关联关系）
        checkGroupDao.deleteCheckItemsIds(checkGroup.getId());
        //向中间表(t_checkgroup_checkitem)插入数据（建立检查组和检查项关联关系）
        setCheckGroupAndCheckItem(checkGroup.getId(),checkitemIds);
        //更新检查组信息
        checkGroupDao.edit(checkGroup);
    }

    /**
     * 删除一条 检查组
     * @param id
     */
    @Override
    public void delete(Integer id) {
        long count = checkGroupDao.findCountByCheckGroupId(id);
        if (count > 0) {
            //当前检查项不关联在检查组，不能删除，抛出一个异常
            throw new RuntimeException("当前检查组被套餐引用，不能删除");
        }
        //可以删除
        checkGroupDao.deleteCheckItemsIds(id);
        checkGroupDao.deleteCheckGroup(id);
    }

    /**
     * 查询所有检查组，用作检查组列表展示
     * @return
     */
    @Override
    public List<CheckGroup> findAllGroup() {
        List<CheckGroup> checkGroupList = checkGroupDao.findAllGroup();
        return checkGroupList;
    }

    /**
     * 设置检查组和检查项之间的关系
     * @param checkGroupId
     * @param checkItemIds
     */
    public void setCheckGroupAndCheckItem(Integer checkGroupId, Integer[] checkItemIds){
        if(checkItemIds != null && checkItemIds.length > 0) {
            for (Integer checkItemId : checkItemIds) {
                /*Map<String, Integer> map = new HashMap<String, Integer>();
                map.put("checkgroup_id", checkGroupId);
                map.put("checkitem_id", checkItemId);
                checkGroupDao.setCheckGroupAndCheckItem(map);*/
                checkGroupDao.setGroupAndItem(checkItemId,checkGroupId);
            }
        }
    }
}
